﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "IGraphicsNode.h"

namespace gcmp
{
    class IPolyCurve;
    class ICurve2d;
    class IGraphicsCurve3d;
    class IPlane;

    /// \brief 二维多段线图形节点
    class GCMP_GRAPHICS_NODE_INTERFACE_EXPORT IGraphicsPolyCurve : public IGraphicsNode
    {
        DEFINE_CAST_DERIVED(gcmp::IGraphicsPolyCurve, gcmp::IGraphicsNode)
    
    public:
        /// \brief 析构器
        virtual ~IGraphicsPolyCurve();

        /// \brief 获取二维多段线
        /// 
        /// 由于IPolyCurve是二维多段线，获取的几何数据是针对于传入坐标系的局部坐标。
        /// \return 二维多段线几何数据
        virtual const IPolyCurve* GetGeometry()const = 0;

        /// \brief 设置二维多段线
        /// 
        /// \param pValue 二维多段线几何数据
        /// \return true-设置成功；false-设置失败
        virtual bool SetGeometry(const IPolyCurve* pValue) = 0;

        /// \brief  获取多段线中曲线的数量
        /// 
        /// \brief  曲线的数量
        virtual int GetCurveCount()const = 0;

        /// \brief   按顺序获取多段线中所有的曲线（拷贝实现）
        /// 
        /// \param  curve2dlist 多段线中所有的曲线的链表
        /// \return  成功返回true,否则返回false(默认返回True)
        virtual bool GetAllCurves(std::vector<OwnerPtr<ICurve2d>>& opCurve2dlist) const = 0;

        /// \brief  获取多段线所在坐标系
        /// 
        /// \return  坐标系
        virtual Coordinate3d GetCoordinate() const = 0;

        /// \brief  启用线型生成
        /// 
        /// \return 返回true表示启用线型生成成功，false表示启用失败
        virtual bool EnableLinetypeGeneration() = 0;

        /// \brief  禁用线型生成
        /// 
        /// \return 返回true表示禁用线型生成成功，false表示禁用失败
        virtual bool DisableLinetypeGeneration() = 0;

        /// \brief  是否启用线型生成
        /// 
        /// \return 返回true表示启用线型生成，false表示禁用线型生成
        virtual bool IsEnableLinetypeGeneration() const = 0;

        /// \brief  获取多段线整体线宽值
        /// 
        /// 获取的线宽值是多段线线宽属性值，并非多段线的样式线宽，其显示效果不受线宽显示开关的影响
        /// \return 多段线整体的线宽值
        virtual double GetLineWidth() const = 0;

        /// \brief  设置多段线整体线宽值
        /// 
        /// 设置的线宽值作为多段线的一个属性，并非多段线的样式线宽值，其显示效果不受线宽显示开关的影响
        /// 若设置的线宽值为0或者处于定像素模式下，那么多段线显示的线宽与样式线宽值保持一致,显示效果会受线宽显示开关影响
        /// \param  lineWidth      线宽值
        /// \return 设置成功返回true,否则返回false
        virtual bool SetLineWidth(double lineWidth) = 0;

        /// \brief  设置多段线某一段的线宽值
        /// 
        /// 设置的线宽值作为多段线的一个属性，并非多段线的样式线宽值，其显示效果不受线宽显示开关的影响
        /// 若设置的线宽值为0或者处于定像素模式下，那么多段线显示的线宽与样式线宽值保持一致,显示效果会受线宽显示开关影响
        /// 多段线每一段均有各自的起点线宽和终点线宽，并且两个线宽值可以不同；
        /// 使用SetLineWidth修改多段线的整体宽度属性时，其中的每段线段起点宽度与终点宽度均设置为整体宽度相同的值
        /// \param  curveIndex      多段线内部某一段的索引值
        /// \param  startWidth      起点线宽值
        /// \param  endWidth        终点线宽值
        /// \return 设置成功返回true,否则返回false
        virtual bool SetSegmentLineWidth(int curveIndex, double startWidth, double endWidth) = 0;

        /// \brief  获取多段线内部某一段的线宽值
        /// 
        /// 获取的线宽值是多段线线宽属性值，并非多段线的样式线宽，其显示效果不受线宽显示开关的影响
        /// \param  curveIndex      多段线内部某一段的索引值
        /// \return 返回多段线内部某一段的起点和终点线宽值，std::pair<double,double>分别对应起点和终点线宽
        virtual std::pair<double,double> GetSegmentLineWidth(int curveIndex) const = 0;

        /// \brief 获取调试信息
        ///
        /// \return 调试信息
        virtual std::wstring GetStringForDebug() const = 0;

        /// \brief 对多段线进行平移
        /// 
        /// \param point 平移向量
        /// \return 返回true表示平移成功，返回false表示平移失败
        virtual bool Translate(const Vector3d& point) = 0;

    public:
        /// \brief 通过一个二维多段线几何，来创建一个多段线图形节点
        /// 
        /// \param pPolyCurve 二维几何多段线
        /// \param pPlane 所在平面
        /// \return 二维多段线图形节点
        static OwnerPtr<IGraphicsPolyCurve> Create(const IPolyCurve* pPolyCurve, const IPlane* pPlane);

        /// \brief  判断多段线是否封闭
        /// 
        /// \return 封闭返回True，否则返回False
        GCMP_DEPRECATED_API(2022 / 07 / 01) virtual bool IsClosed() const = 0;

        /// \brief  将多段线中的所有边反向
        /// 
        /// \return   成功返回true,否则返回false(默认返回True)
        GCMP_DEPRECATED_API(2022 / 07 / 01) virtual bool Reverse() = 0;

        /// \brief  判断多段线是否为逆时针
        /// 
        /// 该接口仅用于判断封闭多段线的方向
        /// \return 逆时针返回True，否则返回False
        GCMP_DEPRECATED_API(2021 / 07 / 01) virtual bool IsAnticlockwise() const = 0;

        /// \brief  判断多段线是否合法
        /// 
        /// \return 合法返回True，否则返回False
        GCMP_DEPRECATED_API(2022 / 07 / 01) virtual bool IsValid() const = 0;

        /// \brief  判断多段线是否是整圆
        /// 
        /// \return true: 是整圆，false: 非整圆
        GCMP_DEPRECATED_API(2022 / 07 / 01) virtual bool IsCircle() const = 0;

        /// \brief  判断多段线是否是整椭圆
        /// 
        /// \return 整椭圆返回True，否则返回False
        GCMP_DEPRECATED_API(2022 / 07 / 01) virtual bool IsEllipse() const = 0;

        /// \brief  判断多段线是否是矩形
        /// 
        /// \return 矩形返回True，否则返回False
        GCMP_DEPRECATED_API(2022 / 07 / 01) virtual bool IsRectangle() const = 0;

        /// \brief 多段线内部增加一段曲线
        ///
        /// \return 返回true表示添加成功，返回false表示添加失败
        GCMP_DEPRECATED_API(2022 / 08 / 01) virtual bool AddGCurve(OwnerPtr<IGraphicsCurve3d> opGCurve3d) = 0;

        /// \brief  创建一个空的多段线(不包含任何线)
        /// 
        /// \return  二维多段线图形节点(不包含任何线)
        GCMP_DEPRECATED_API(2022 / 08 / 01) static OwnerPtr<IGraphicsPolyCurve> Create();

        /// \brief  设置多段线所在的坐标系
        /// 
        /// \param  coordinate3d      坐标系
        /// \return 成功返回true,否则返回false
        GCMP_DEPRECATED_API(2022 / 10 / 01) virtual bool SetCoordinate(const Coordinate3d& coordinate3d) = 0;

        /// \brief 通过一个二维多段线几何，来创建一个多段线图形节点
        /// 
        /// \param pPolyCurve 二维几何多段线
        /// \param coordinate 传入坐标系
        /// \return 二维多段线图形节点
        GCMP_OBSOLETE_API(2022 / 10 / 01, IGraphicsPolyCurve::Create(const IPolyCurve*, const IPlane*)) static OwnerPtr<IGraphicsPolyCurve> Create(const IPolyCurve* pPolyCurve, const Coordinate3d& coordinate);
    };
}